﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//C语言的system函数可以执行系统命令
//包含在<stdlib.h>头文件里

//int main()
//{
//	//设置控制台的大小
//	//cols表示列，lines表示行
//	system("mode con cols=100 lines=36");
//	system("title 贪吃蛇");//设置控制台的名称
//	//控制台运行结束就不显示标题了
//	//getchar();//用getchar()函数获取字符，让其先不要运行结束
//	//另一种方法：
//	//system("pause");//pause：暂停，出现按任意键继续
//
//	return 0;
//}

#include<windows.h>//使用COORD需要包含该头文件
#include<stdbool.h>//false所需要的头文件
int main1()
{
	//表示一个字符在控制台屏幕上的坐标
	/*COORD pos = { 40,10 };
	return 0;*/

	//函数 GetStdHandle
	//用来获取某一标准设备的句柄（某一设备的标识），用该句柄操作该设备
	//获取操作某一设备的标识，有了标识才能操作该设备
	//函数定义： HANDLE GetStdHandle(DWORD nStdHandle);
	//它的参数只有三种
	//输入、输出、错误三种参数、表示三种设备
	//输入对应的参数获得对应的设备标识，操作权
	
	 /*
	 HANDLE hOutput = NULL;//接收函数返回值，一般为指针
     //获取标准输出的句柄(⽤来标识不同设备的数值)
     hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	*/
	 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//GetConsoleCursorInfo的第一个参数
	//作用：游戏时隐藏控制台的光标
	//用该函数获取需要被隐藏光标的设备（也就是确定是在哪一个控制台）
	
	 CONSOLE_CURSOR_INFO CursorInfo = { 0 };//GetConsoleCursorInfo的第二个参数
	 GetConsoleCursorInfo(handle, &CursorInfo);
	 //函数GetConsoleCursorInfo
	//作用：获取有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息
	//获取后放在一个结构体变量里
	//有两个参数
	/*BOOL WINAPI GetConsoleCursorInfo(
	 HANDLE hConsoleOutput,//获取设备信息，也就是在哪个设备上操作
	 CONSOLE_CURSOR_INFO lpConsoleCursorInfo//CONSOLE_CURSOR_INFO一个结构体指针，接收有关主机游戏光标信息的结构体
	 )*/

	 //CONSOLE_CURSOR_INFO结构体
	 /*typedef struct _CONSOLE_CURSOR_INFO {
		DWORD dwSize;//光标显示的大小
		BOOL bVisible;//光标的可见性，true就为可见
	 } CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO
	 */

	 //SetConsoleCursorInfo
	 //设置指定控制台屏幕缓冲区的光标的大小和可见性。
	 //GetConsoleCursorInfo(handle, &CursorInfo);//获取原来信息
	 //CursorInfo.dwSize = 100;//更改想要改变的
	 CursorInfo.bVisible = false;//不让光标显示
	 SetConsoleCursorInfo(handle, &CursorInfo);//用该函数传参改变	

	 return 0;
}
//封装一个函数每次设置光标坐标的时候更方便
//void SetPos(int x, int y)
//{
//	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//	COORD pos = {x,y};
//	SetConsoleCursorPosition(handle, pos);
//}
int main2()
{
	// SetConsoleCursorPosition 设置光标在指定位置出现，设置光标的位置信息
	/*设置指定控制台屏幕缓冲区中的光标位置，
	我们将想要设置的坐标信息放在COORD类型的pos中，
	调用SetConsoleCursorPosition函数将光标位置设置到指定的位置
	*/
	//获得设备句柄
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	//根据句柄设置光标的位置
	COORD pos = { 20,5 };
	SetConsoleCursorPosition(handle, pos);
	//SetPos(20, 5);//反复设置同一位置光标，可以重复覆盖内容
	printf("hehe\n");//打印的位置不再是左上角第一位
	return 0;
}

//与1按位与&判断最低位是不是1，得知键是否被按过
//#define KEY_PRESS(vk) (GetAsyncKeyState(vk)&0x1 ? 1:0)
//int main()
//{
//	//GetAsyncKeyState获取按键情况函数，操纵蛇的移动
//	//将键盘上每个键的虚拟键值传递给函数，函数通过返回值来分辨按键的状态
//	//返回值是short类型
//	/*如果返回的16位的short数据中，最⾼位是1，说明按键的状态是按下，
//	如果最高是0，说明按键的状态是抬起；
//	如果最低位被置为1则说明，该按键被按过，否则为0*/
//	while (1)
//	{
//		if (KEY_PRESS(0x30))//0x30——横排的1键的虚拟键值
//			printf("0\n");
//		else if (KEY_PRESS(0x31))
//			printf("1\n");
//		else if (KEY_PRESS(0x32))
//			printf("2\n"); 
//		else if (KEY_PRESS(0x33))
//			printf("3\n"); 
//		else if (KEY_PRESS(0x34))
//			printf("4\n");
//		else if (KEY_PRESS(0x35))
//			printf("5\n");
//		else if (KEY_PRESS(0x36))
//			printf("6\n");
//		else if (KEY_PRESS(0x37))
//			printf("7\n");
//		else if (KEY_PRESS(0x38))
//			printf("8\n");
//		else if (KEY_PRESS(0x39))
//			printf("9\n");
//	}
//	return 0;
//}

#include<locale.h>//使用setlocale函数
//int main()
//{
//	//setlocale(LC_ALL, "C");
//	//setlocale的返回值是一个字符串指针，
//	//表示已经设置好的格式，如果调用失败，则返回空指针NULL
//	//setlocale可以用来查询当前地区，这时第二个参数设为NULL就可以
//	char* loc;
//	loc = setlocale(LC_ALL, "C");
//	printf("默认的本地信息:%s\n", loc);
//
//	loc = setlocale(LC_ALL, "");//第二个参数为空
//	printf("设置后的本地信息:%s\n", loc);
//
//	return 0;
//}

//打印宽字符:占2个字符位置
//宽字符的字面量必须加上前缀L，否则C语言会把字面量当作窄字符类型处理
//前缀L在单引号前面，表示宽字符，宽字符的打印使用wprintf,
//对应wprintf()的占位符位%lc;在双引号前面，表示宽字符串
//对应wprintf()的占位符位%ls
//int main()
//{
//	setlocale(LC_ALL, "");
//
//	wchar_t ch1 = L'中';
//	wchar_t ch2 = L'国';
//	wchar_t ch3 = L'●';
//	wchar_t ch4 = L'■';
//
//	wprintf(L"%lc\n",ch1);
//	wprintf(L"%lc\n", ch2);
//	wprintf(L"%lc\n", ch3);
//	wprintf(L"%lc\n", ch4);
//
//	printf("ab\n");//对比两个字符
//	return 0;
//}